package com.fdb.efp.nls.service.util;

import static java.util.Objects.requireNonNull;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baidu.unionloan.common.util.Security;
import com.baidu.unionloan.file.service.decryption.DecryptParam;
import com.baidu.unionloan.service.CipherService;
import com.dc.open.file.client.ftp.FtpGet;
import com.dc.open.file.server.msg.FileMsgBean;

public class BaiduFileCyptUtil {

	private static Logger logger = LoggerFactory.getLogger(BaiduFileCyptUtil.class);

	/**
	 * @description:使用百度提供的SDK进行文件解密
	 * @param tar
	 *            tar包
	 * @param md5
	 *            md5文件
	 * @param target
	 *            解密输出路径
	 * @param suffix
	 *            加密文件后缀或完整名称，若加密文件为压缩包，必须填完整文件名
	 * @param privateKey
	 *            我方私钥
	 * @param publicKey
	 *            对方公钥
	 * @throws Exception
	 * @date:2019年1月16日 下午3:30:17
	 * @author:hengyh
	 */
	public static void decryptFile(File tar, File md5, String target, String suffix, String privateKey, String publicKey) throws Exception {
		logger.info("开始进行百度文件解密...");
		logger.info("tar包路径： " + requireNonNull(tar).getAbsolutePath());
		logger.info("md5文件路径： " + requireNonNull(md5).getAbsolutePath());
		if (suffix == null || suffix.equals("")) {
			logger.warn("参数suffix：加密文件后缀为空，使用默认值 " + ".txt");
			suffix = ".txt";
		}
		logger.info("加密文件后缀: " + suffix);

		String resourcePath = tar.getParent();
		if (!resourcePath.equals(md5.getParent())) {
			logger.error("tar包和MD5文件需在同一个文件夹下！");
			throw new Exception("tar包和MD5文件需在同一个文件夹下！");
		}

		boolean verifyFile = verifyFile(tar, md5);
		if (!verifyFile) {
			logger.error("md5校验失败！");
			throw new Exception("md5校验失败！");
		}
		logger.info("md5校验成功！");

		try {
			logger.info("目标路径：" + requireNonNull(target));
			CipherService.decryptFileData(getDecryptParam(resourcePath, tar.getName(), target, suffix, privateKey, publicKey));
			logger.info("解密百度文件成功");
		} catch (Exception e) {
			logger.error("解密百度文件失败！", e);
			throw e;
		}
	}

	/** ---------------------------------------------------- **/
	/** private methods **/
	/** ---------------------------------------------------- **/

	private static boolean verifyFile(File tar, File md5) throws Exception {
		String fileMd5 = FileUtils.readLines(md5, "UTF-8").get(0);
		String actualMd5 = Security.generateMD5(tar);
		return fileMd5.equals(actualMd5);
	}

	private static DecryptParam getDecryptParam(String resourcePath, String tarName, String target, String fileSuffix, String privateKey,
			String publicKey) {
		DecryptParam param = new DecryptParam();
		// 是否需要解压
		param.setNeedUnTar(true); // 固定
		// 加密文件所在目录
		param.setEncryptDir(resourcePath); // 已输入
		// 加密文件所在压缩包，压缩包本身未加密
		param.setTarFileName(tarName); // 已输入
		// 加密文件后缀或完整名称，若加密文件为压缩包，必须填完整文件名
		param.setFileSuffix(fileSuffix); // 已输入
		// 解密输出目录
		param.setDecryptDir(target); // 已输入
		// 解密对方提供的加密文件
		param.setPrivateKeyLocal(privateKey); // 我方私钥
		param.setPublicKeyPartner(publicKey); // 对方公钥
		// 从解压出来的key文件中读加密信息
		param.setNeedReadKEYFile(true);// 固定 -- 可配置
		param.setKeyFileName("key");// 固定 -- 可配置
		return param;
	}

	/**
	 * 
	 * 百度下载文件方法
	 * 
	 * @param tarFilePath
	 *            远程文件路劲
	 * @param localFilePath
	 *            本地下载存放文件路径
	 * @param sysFlag
	 *            平台标识
	 * @return
	 * @author liyakui
	 * @since 2019年1月31日 上午10:04:15
	 * @version 1.0
	 */
	public static boolean baiduDownFile(String tarFilePath, String localFilePath, String sysFlag) throws Exception {

		FtpGet ftpGet = null;
		FileMsgBean bean = null;
		boolean result = true;
		try {
			bean = new FileMsgBean();
			ftpGet = new FtpGet(tarFilePath, localFilePath, sysFlag, false, "IOP_DMZ_WAILIAN", bean);
			ftpGet.doGetFile();
		} catch (Exception e) {
			result = false;
			String beanMessage = null;
			if (bean != null) {
				beanMessage = bean.getFileRetMsg();
			}
			logger.debug(beanMessage + e.getMessage());
			throw e;
		} finally {
			if (ftpGet != null) {
				ftpGet.close();
			}
		}
		return result;

	}

}
